﻿/*********************************************************************************************************************
 * OPTIM
 *********************************************************************************************************************
 * Page: SyncList.Business.ValueObject.DirectoryItem
 * 
 * Description :
 * -------------
 * Représente n'importe quel item d'un Directory, fichier ou dossier. Créée donc les membres abstraits communs
 * 
 * Historique :
 * ------------
 * 10/12/2011 9:37:15 PM - Emmanuel - V__.__.__ - Création
 * 
 * 
 *********************************************************************************************************************/

using System.ComponentModel;
using SyncList.Business.Helpers;

namespace SyncList.Business.ValueObject
{

    /// <summary>
    /// Représente n'importe quel item d'un Directory
    /// </summary>
    /// <Creation>10/12/2011 9:37:15 PM Emmanuel</Creation>
    public abstract class ItemBase
    {

        #region Attributs

        /// <summary>
        /// Répertoire parent
        /// </summary>
        private DirectoryContent _parent;

        /// <summary>
        /// Etat pour cet item
        /// </summary>
        private ExplorerItemState _state = ExplorerItemState.Unknown;

        /// <summary>
        /// Action pour cet item
        /// </summary>
        private ExplorerItemAction _action = ExplorerItemAction.Nothing;

  

        #endregion

        #region Constructeur

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="parent">Parent du dossier ou fichier en cours</param>
        public ItemBase(DirectoryContent parent)
        {
            _parent = parent;

           
        }

        #endregion

        #region Accesseurs


        /// <summary>
        /// Taille des fichiers du dossier
        /// </summary>
        public abstract long Size { get; set; }

        /// <summary>
        /// Nom du fichier / du dossier
        /// </summary>
        public abstract string Name { get; set; }

        /// <summary>
        /// Indique si c'est un dossier
        /// </summary>
        public abstract bool IsFolder { get; }

           /// <summary>
        /// Nombre de fichiers au total ici et dans tous les enfants
        /// </summary>
        public abstract int FileCount { get; }

        /// <summary>
        /// Afficher le tooltip
        /// </summary>
        public abstract string ToolTip { get; }
   

        /// <summary>
        /// Taille formatée pour affichage
        /// </summary>
        public string SizeCaption
        {
            get
            {
                return (SizeHelper.FormatSize(Size));
            }
        }


        /// <summary>
        /// Répertoire parent
        /// </summary>
        public DirectoryContent Parent
        {
            get { return _parent; }
            set { _parent = value; }
        }


        /// <summary>
        /// Etat pour cet item
        /// </summary>
        public ExplorerItemState State
        {
            get { return (_state); }
            set { _state = value; OnPropertyChanged("State"); }
        }

        /// <summary>
        /// Action pour cet item
        /// </summary>
        public ExplorerItemAction Action
        {
            get { return (_action); }
            set { _action = value; OnPropertyChanged("Action"); }
        }



        #endregion

        #region Méthodes

        public override string ToString()
        {
            string txt = "";
            if (IsFolder)
                txt = "[D]";
            else
                txt = "[F]";
            return (txt + Name);            
        }


        #endregion

        #region PropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Déclencher l'événement
        /// </summary>
        /// <param name="propertyName"></param>
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion

    }
}
